package DataStructure.arrayRelevant.matrix;

import Common.Utils.MathTools;
import Common.Utils.UTFactory;
import org.junit.Test;

/**
 * @author 蔚蔚樱
 * @version 1.0
 * @date 2018-7-19 下午03:07:41
 * @author—Email micromicrohard@outlook.com
 * @description 矩阵相乘
 * 给定矩阵A、B，计算A、B矩阵相乘后的矩阵
 */
public class Matrix_Multiplication {

    @Test // 验证功能：从数据库获取测试数据，用于单元测试
    public void TestFunc() throws Exception {
        UTFactory.FullTest(this.getClass());
    }

    @Test // 调试功能 : 用于复现错误的测试案例
    public void DoubleTrack() throws Exception {
        String input = "";
        String output = "";
        UTFactory.DebugTest(this.getClass(), input, output);
    }

    public int[][] MultiplyMethod(int[][] matrix_a, int[][] matrix_b) {
        if (!MathTools.judgeIsRectangle(matrix_a) || !MathTools.judgeIsRectangle(matrix_b)) {
            return null;
        }

        //定义相乘后的矩阵
        int row = matrix_a.length;      //获取矩阵的行
        int column = matrix_b[0].length;//获取矩阵的列
        int[][] matrix_c = new int[row][column];
        int k = matrix_b.length;        //矩阵相乘的中间元素个数

        if (k != matrix_a[0].length) {
            return null;
        }
        //矩阵相乘
        for (int i = 0; i < row; i++) {        //首先循环A矩阵的行,时间复杂度：O(matrix_a.length)
            for (int j = 0; j < column; j++) { //再循环B矩阵的列,  时间复杂度：O(matrix_b[0].length)
                //A矩阵的行元素和B矩阵列元素逐个相乘,
                //注意matrix_b.length=matrix_a[0].length != matrix_c的任何值
                for (int h = 0; h < k; h++) {
                    matrix_c[i][j] += matrix_a[i][h] * matrix_b[h][j];
                }
            }
        }
        return matrix_c;
    }
}